package com.myacg.platform.living;


import com.myacg.core.entity.Point;
import com.myacg.core.task.KeepTask;
import com.myacg.core.task.KeepTaskManager;
import com.myacg.core.utils.MoveUtils;

/**
 * 可以移动的物体
 * 根据方向和对应加速度进行计算速度，计算位移
 * @author Administrator
 *
 */
public abstract class MoveLiving extends BaseLiving{
	
	protected double v; //当前速度
	protected double v0;//0
	protected double m;//重量
	protected double F; //在方向上的作用力
	protected Point startPoint; //起始坐标
	protected double direction;//方向 斜率 与水平x轴的斜率值
	
	protected MoveLiving(Point point) {
		super(point);
		startPoint=new Point(point.x, point.y);
		v=v0=0;
		m=5;
	}
	//当方向发生改变时触发的方法
	public abstract void directionChanged();
	
	/**
	 * 重写父类的runStart
	 * 提供一种显式的启动任务 
	 * @param layter
	 * @param sleep
	 */
	public void RunStart(int sleep){
		task= new KeepTask(sleep) {
			@Override
			public void secondExecute() {
				 runToMove();
				 run();
			}
			@Override
			public void overExecute() {
			    whenOver();
			}
		};
		//创建任务
	    KeepTaskManager.getInstance().addTask(task);
	};
	
	
	 
	protected double oldDir;
	protected double t;
	protected double S;
	protected double olda;
	/**
	 * 普通的直线行走函数
	 */
	protected void runToMove(){
			//只有速度大于0才可能触发唯一
			if(isChangeDir()){
				directionChanged();
			}
			//加速度
			double a = F/m;
 			//如果加速度发生变化或者运动方向发生变化 则重置计算位移函数
			if(olda!=a){
				startPoint.x=point.x;
				startPoint.y=point.y;
				v0=v;
				t=0;
			}
			//根据初速度和加速度计算偏移量
			S=MoveUtils.getNextS(v0, a, t);
			//计算当前速度
			v = v0+a*t;
			if(v>0){
			//根据偏移量和倾斜角计算x，y的新坐标 
			 point=MoveUtils.getNextOvalPoint(S, direction, startPoint); 
			}
			//如果速度和加速度都不为0 则累计时间变量
			if(a<=0&&v<=0){
				t=0;
				v0=0;
			}else{
				t+=1;
			}
			System.out.println("aa");
			//重置方向
			oldDir=direction;
			olda=a;
	}
	
	public boolean isChangeDir(){
		return oldDir!=direction;
	}
	public double getChangeAngle(){
		return oldDir-direction;
	}
	public double getF() {
		return F;
	}
	public void setF(double f) {
		F = f;
	}
	public double getDirection() {
		return direction;
	}
	public void setDirection(double direction) {
		this.direction = direction;
	}
}
